#include "../include/stdio.h"
#include "../include/pantalla.h"
#include "../include/teclado.h"
#include "../include/string.h"
#include "../include/mouse.h"
#include "../include/kernel.h"

/*
 * recibe una cadena de formato y n argumentos que se insertaran dentro de la cadena de formato.
 * los modificadores aceptados son:
 * %d - entero
 * %s - string
 */
void printf ( char *str, ... )
{
	char **arg = (char **) &str;
	char buf[10];
	int i;
	arg++; // arg apunta ahora al segundo parametro


	for (i=0;i<strlen(str);i++)
	{
		if (str[i]!='%')
			putchar(str[i]);
		else
		{
			switch(str[i+1])
			{
			case 'd':
				intToString(buf,(int) *(arg++));
				printf(buf);
				i++;
				break;
			case 's':
				printf((char *) *(arg++));
				i++;
				break;
			default:
				putchar(str[i]);
				break;
			}
		}
	}
}

/*
 * Imprime un caracter en pantalla
 */
void putchar(char c)
{
	int i;

	switch(c)
	{
	case '\n':		// recursivamente imprime espacios hasta llegar al fin de linea
		do
		{
			putchar(' ');
		} while (pantalla->cursorW % (COLUMNAS*2) != 0 );
		break;
	case '\t':		// recursivamente imprime N espacios equivalentes a una tabulacion
		for (i=0;i<ESPACIOS_TAB;i++)
			putchar(' ');
		break;
	case '\b':
		putchar(' ');			// borra el cursor actual imprimiento un espacio y luego retrocede
		pantalla->cursorW-=4;	// 2 posiciones (al imprimir despues el cursor se borra el caracter)
		break;
	default:		// si es un caracter normal
		if (pantalla->cursorW==COLUMNAS*FILAS*2)	// si estoy al final de la pantalla hago un scroll
			scroll();

		writeChar(STDOUT,c);		// uso System Call writeChar para imprimir el caracter
		setMouse();					// redibujo el mouse por si el caracter se imprimio sobre el mouse
		setSeleccionMouse();		// redibujo la seleccion por si el caracter se imprimio sobre ella
		pantalla->cursorW+=2;		// avanzo el cursor de la pantalla a la siguiente posicion
		break;
	}
}

/*
 * Lee un caracter del teclado
 */
char getchar()
{
	char aux;
	readChar(STDIN,&aux);			// utilizo la System Call readChar
	return aux;
}

/*
 * Leo una linea del teclado
 */
void getLine(char *str)
{
	int i=0;
	char letra;

	while ((letra=getchar())!='\n')	// leo de a un caracter hasta que se presione Enter
	{
		if (letra!=0)				// si leo un '\0' significa que no hay nada en el buffer asi que
			str[i++]=letra;			// itera hasta que el usuario presione alguna tecla
	}
	str[i]=0;

	restartTeclado();	// vacia el buffer de teclado y setea en 0 los cursores de lectura/escritura
}
